package com.xmut.mall.coupon.service.impl;

import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xmut.mall.coupon.dao.CouponActivityDao;
import com.xmut.mall.coupon.dao.CouponDao;
import com.xmut.mall.coupon.entity.CouponActivityEntity;
import com.xmut.mall.coupon.entity.CouponActivityItemEntity;
import com.xmut.mall.coupon.entity.CouponEntity;
import com.xmut.mall.coupon.searchparams.CouponActivitySearchParam;
import com.xmut.mall.coupon.service.CouponActivityItemService;
import com.xmut.mall.coupon.service.CouponActivityService;
import com.xmut.mall.coupon.service.CouponService;
import com.xmut.mall.coupon.utils.PageUtil;
import com.xmut.mall.coupon.utils.RespBean;
import com.xmut.mall.coupon.vo.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

@Service("couponActivityService")
public class CouponActivityServiceImpl extends ServiceImpl<CouponActivityDao, CouponActivityEntity> implements CouponActivityService {

    @Autowired
    private CouponActivityItemService couponActivityItemService;

    @Autowired
    private CouponDao couponDao;

    /**
     * 添加券活动
     * @param vo
     * @return
     */
    @Override
    public RespBean addCouponActivity(AddCouponActivityVo vo) {
        CouponActivityEntity couponActivityEntity = new CouponActivityEntity();
        Long id = IdWorker.getId();
        couponActivityEntity.setId(id);
        couponActivityEntity.setPromotionName(vo.getPromotionName());
        couponActivityEntity.setActivityScope(vo.getActivityScope());
        couponActivityEntity.setCouponActivityType(vo.getCouponActivityType());
        couponActivityEntity.setStartTime(vo.getStartTime());
        couponActivityEntity.setEndTime(vo.getEndTime());
        couponActivityEntity.setStoreId(0L);
        couponActivityEntity.setStoreName("platform");
        couponActivityEntity.setCreateTime(new Date());

        if (CollUtil.isNotEmpty(vo.getMemberDTOS())){
            // 如果vo.getMemberDTOS()不是空就把它json序列化然后存储
            couponActivityEntity.setActivityScopeInfo(JSON.toJSONString(vo.getMemberDTOS()));
        }

        // 保存 CouponActivityItem
        List<CouponActivityItemEntity> couponActivityItemEntityList = vo.getCouponActivityItems().stream().map(item -> {
            CouponActivityItemEntity entity = new CouponActivityItemEntity();
            entity.setActivityId(id);
            entity.setCouponId(item.getCouponId());
            entity.setNum(item.getNum());
            entity.setCreateTime(new Date());
            return entity;
        }).collect(Collectors.toList());
        boolean b = couponActivityItemService.saveBatch(couponActivityItemEntityList);


        boolean save = this.save(couponActivityEntity);

        if (b&&save){
            return RespBean.success("添加成功");
        }else {
            return RespBean.error("添加失败");
        }

    }

    /**
     * 获取官方管理后台的券活动的分页数据
     * @param vo
     * @param param
     * @return
     */
    @Override
    public RespBean getManagerCouponActivityPage(PageVO vo, CouponActivitySearchParam param) {
        IPage<ManagerCouponActivityPageVo> page = this.baseMapper.getManagerCouponActivityPage(PageUtil.initPage(vo),param);

        return RespBean.success("获取成功",page);
    }

    /**
     * 获取官方管理端的去昂活动的详情
     * @param id
     * @return
     */
    @Override
    public RespBean getManagerCouponActivityDetail(Long id) {
        CouponActivityDetailVo vo = new CouponActivityDetailVo();
        CouponActivityEntity couponActivityEntity = this.getById(id);
        vo.setId(id);
        vo.setPromotionName(couponActivityEntity.getPromotionName());
        vo.setPromotionStatus(couponActivityEntity.getPromotionStatus());
        vo.setCouponActivityType(couponActivityEntity.getCouponActivityType());
        vo.setActivityScope(couponActivityEntity.getActivityScope());
        vo.setActivityScopeInfo(couponActivityEntity.getActivityScopeInfo());
        vo.setStartTime(couponActivityEntity.getStartTime());
        vo.setEndTime(couponActivityEntity.getEndTime());

        // 查询优惠券
        List<CouponActivityItemEntity> list = couponActivityItemService.list(new QueryWrapper<CouponActivityItemEntity>().eq("activity_id", id));

        List<CouponActivityItemsVo> couponActivityItemsVos = list.stream().map(item -> {
            CouponActivityItemsVo activityItemVo = new CouponActivityItemsVo();
            CouponEntity couponEntity = couponDao.selectById(item.getCouponId());
            activityItemVo.setCouponName(couponEntity.getCouponName());
            activityItemVo.setCouponType(couponEntity.getCouponType());
            activityItemVo.setCouponDiscount(couponEntity.getCouponDiscount());
            activityItemVo.setPrice(couponEntity.getPrice());
            activityItemVo.setNum(item.getNum());
            return activityItemVo;
        }).collect(Collectors.toList());
        vo.setCouponActivityItems(couponActivityItemsVos);

        return RespBean.success("获取成功",vo);
    }

    /**
     * 关闭券活动
     * @param id
     * @return
     */
    @Override
    public RespBean closeCouponActivity(Long id) {
        boolean update = this.update(new UpdateWrapper<CouponActivityEntity>()
                .set("start_time", null)
                .set("end_time", null)
                .eq("id", id));

        if (update){
            return RespBean.success("关闭券活动成功");
        }else {
            return RespBean.error("关闭券活动失败");
        }

    }
}
